"""
@author: wanghongliang
@file: study_05_广播.py
@time: 2021/11/21 14:33 
"""
import numpy as np

"""
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式， 对数组的算术运算通常在相应的元素上进行。
如果两个数组 a 和 b 形状相同，即满足 a.shape == b.shape，那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同，且各维度的长度相同。
"""

a = np.arange(12).reshape(4,3)
print(a * 2)
"""
[[ 0  2  4]
 [ 6  8 10]
 [12 14 16]
 [18 20 22]]
"""

a = np.array([1,2,3,4])
b = np.array([10,20,30,40])

print(a * b)  # [ 10  40  90 160]


"""
当运算中的 2 个数组的形状不同时，numpy 将自动触发广播机制。如：
"""
a = np.arange(0, 12).reshape(4,3)
b = np.array([1,2,3])
print(a)
print(a + b)
"""
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
 
[[ 1  3  5]
 [ 4  6  8]
 [ 7  9 11]
 [10 12 14]]
 
 4x3 的二维数组与长为 3 的一维数组相加，等效于把数组 b 在二维上重复 4 次再运算：
"""


a = np.array([[0, 0, 0],
              [10, 10, 10],
              [20, 20, 20],
              [30, 30, 30]])
b = np.array([1, 2, 3])
bb = np.tile(b, (4, 1))  # 重复 b 的各个维度

print(a + bb)
"""
[[ 1  2  3]
 [11 12 13]
 [21 22 23]
 [31 32 33]]
"""

"""np.tile 扩展数组
np.tile(数组,(Y轴扩大倍数，X轴扩大倍数))  X轴或者Y轴 扩大一倍便为不复制
"""
bb = np.tile(b, (4, 1))  # 把 b 沿Y轴扩大4倍 沿X轴不变
print(bb)
"""
[[1 2 3]
 [1 2 3]
 [1 2 3]
 [1 2 3]]
"""

# 沿X轴复制
print(np.tile(b, (2)))  # [1 2 3 1 2 3]

